const { body, query, param, validationResult } = require('express-validator');
const { validationError } = require('../utils/response');

/**
 * 处理验证结果的中间件
 */
const handleValidationErrors = (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return validationError(res, errors.array());
  }
  next();
};

/**
 * 用户登录验证规则
 */
const validateLogin = [
  body('username')
    .notEmpty()
    .withMessage('用户名不能为空')
    .isLength({ min: 3, max: 50 })
    .withMessage('用户名长度必须在3-50个字符之间'),
  body('password')
    .notEmpty()
    .withMessage('密码不能为空')
    .isLength({ min: 6 })
    .withMessage('密码长度至少6个字符'),
  handleValidationErrors
];

/**
 * 用户注册验证规则
 */
const validateRegister = [
  body('username')
    .notEmpty()
    .withMessage('用户名不能为空')
    .isLength({ min: 3, max: 50 })
    .withMessage('用户名长度必须在3-50个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  body('password')
    .notEmpty()
    .withMessage('密码不能为空')
    .isLength({ min: 6, max: 128 })
    .withMessage('密码长度必须在6-128个字符之间'),
  body('nickname')
    .notEmpty()
    .withMessage('昵称不能为空')
    .isLength({ min: 1, max: 50 })
    .withMessage('昵称长度必须在1-50个字符之间'),
  body('phone')
    .notEmpty()
    .withMessage('手机号不能为空')
    .isMobilePhone('zh-CN')
    .withMessage('请输入有效的手机号'),
  body('verifyCode')
    .notEmpty()
    .withMessage('验证码不能为空')
    .isLength({ min: 4, max: 6 })
    .withMessage('验证码长度必须在4-6个字符之间'),
  handleValidationErrors
];

/**
 * 分页参数验证规则
 */
const validatePagination = [
  query('page')
    .optional()
    .isInt({ min: 1 })
    .withMessage('页码必须是大于0的整数'),
  query('limit')
    .optional()
    .isInt({ min: 1, max: 100 })
    .withMessage('每页数量必须是1-100之间的整数'),
  handleValidationErrors
];

/**
 * ID参数验证规则
 */
const validateId = [
  param('id')
    .isInt({ min: 1 })
    .withMessage('ID必须是大于0的整数'),
  handleValidationErrors
];

/**
 * 语音评测提交验证规则
 */
const validateVoiceEvaluation = [
  body('textId')
    .isInt({ min: 1 })
    .withMessage('文本ID必须是大于0的整数'),
  body('duration')
    .isFloat({ min: 0.1, max: 300 })
    .withMessage('录音时长必须在0.1-300秒之间'),
  handleValidationErrors
];

/**
 * 游戏结果提交验证规则
 */
const validateGameSubmission = [
  body('contentId')
    .isInt({ min: 1 })
    .withMessage('内容ID必须是大于0的整数'),
  body('duration')
    .isFloat({ min: 0.1, max: 60 })
    .withMessage('录音时长必须在0.1-60秒之间'),
  handleValidationErrors
];

/**
 * 每日一句提交验证规则
 */
const validateDailySubmission = [
  body('sentenceId')
    .isInt({ min: 1 })
    .withMessage('句子ID必须是大于0的整数'),
  body('duration')
    .isFloat({ min: 0.1, max: 120 })
    .withMessage('录制时长必须在0.1-120秒之间'),
  handleValidationErrors
];

/**
 * 搜索验证规则
 */
const validateSearch = [
  query('keyword')
    .notEmpty()
    .withMessage('搜索关键词不能为空')
    .isLength({ min: 1, max: 100 })
    .withMessage('搜索关键词长度必须在1-100个字符之间'),
  ...validatePagination
];

module.exports = {
  handleValidationErrors,
  validateLogin,
  validateRegister,
  validatePagination,
  validateId,
  validateVoiceEvaluation,
  validateGameSubmission,
  validateDailySubmission,
  validateSearch
};
